import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import warnings
import os
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.font_manager import FontProperties

# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

warnings.filterwarnings('ignore')  # 忽略警告信息


# 工单编号：大数据-八维保险数据挖掘-04-财产保险成本费用相关
class PropertyInsuranceAnalyzer:
    def __init__(self, start_date='2025-01-01', end_date='2025-12-31'):
        """
        财产保险成本费用分析器

        初始化分析器，设置分析时间范围，生成模拟数据，配置AD标阈值
        :param start_date: 分析开始日期 (格式: 'YYYY-MM-DD')
        :param end_date: 分析结束日期 (格式: 'YYYY-MM-DD')
        """
        # 设置分析时间范围
        self.start_date = pd.to_datetime(start_date)
        self.end_date = pd.to_datetime(end_date)

        # 创建输出目录
        self.output_dir = f"property_insurance_analysis_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
        os.makedirs(self.output_dir, exist_ok=True)

        # 生成模拟业务数据
        self.data = self.generate_sample_data()

        # 区域代码到中文名称的映射
        self.region_mapping = {'HQ': '总部', 'EAST': '东部区域', 'WEST': '西部区域'}

        # AD标（异常检测）阈值配置
        self.ad_thresholds = {
            '赔付率(%)': 70.0,  # 赔付率超过70%预警
            '综合成本率(%)': 100.0,  # 综合成本率超过100%预警
            '手续费佣金比率(%)': 15.0  # 手续费佣金比率超过15%预警
        }

    def generate_sample_data(self, num_policies=1000):
        """
        生成模拟保险业务数据

        根据业务规范生成模拟数据，包括保单、再保、理赔和财务数据
        :param num_policies: 生成的保单数量 (默认1000份)
        :return: 包含所有业务数据的DataFrame
        """
        np.random.seed(42)  # 设置随机种子确保结果可重现

        # 生成时间序列 - 保单签发日期
        date_range = pd.date_range(self.start_date, self.end_date)
        dates = np.random.choice(date_range, num_policies)

        # 机构信息配置
        institutions = ['inst_hq', 'inst_east', 'inst_west']  # 机构ID
        region_codes = ['HQ', 'EAST', 'WEST']  # 区域代码
        registered_capitals = [50000000, 30000000, 20000000]  # 注册资本（代表所有者权益）

        # ========== 生成保单数据 ==========
        policy_ids = [f'pol_{i}' for i in range(num_policies)]  # 保单ID
        # 随机分配机构ID，概率权重：总部30%，东部40%，西部30%
        institution_ids = np.random.choice(institutions, num_policies, p=[0.3, 0.4, 0.3])
        # 总保费（原保费收入）在5000-15000之间随机分布
        total_premiums = np.random.uniform(5000, 15000, num_policies)
        # 净保费（总保费扣除部分费用）约为总保费的70%-90%
        net_premiums = total_premiums * np.random.uniform(0.7, 0.9, num_policies)

        # ========== 生成再保分出数据 ==========
        # 70%的保单有再保分出
        ceded_flags = np.random.choice([0, 1], num_policies, p=[0.3, 0.7])
        # 分出保费（分出保费）占总保费的10%-30%
        ceded_premiums = np.where(ceded_flags == 1,
                                  total_premiums * np.random.uniform(0.1, 0.3, num_policies),
                                  0)
        # 摊回分保费用（摊回分保费用）占总保费的5%-15%
        ceded_commissions = np.where(ceded_flags == 1,
                                     total_premiums * np.random.uniform(0.05, 0.15, num_policies),
                                     0)

        # ========== 生成理赔数据 ==========
        # 60%的保单有理赔发生
        claim_flags = np.random.choice([0, 1], num_policies, p=[0.4, 0.6])
        # 赔付支出（赔付支出）占净保费的10%-60%
        claim_paids = np.where(claim_flags == 1,
                               net_premiums * np.random.uniform(0.1, 0.6, num_policies),
                               0)
        # 提取未决赔款准备金（提取未决赔款准备金）占净保费的5%-15%
        os_reserve_incurreds = np.where(claim_flags == 1,
                                        net_premiums * np.random.uniform(0.05, 0.15, num_policies),
                                        0)
        # 转回未决赔款准备金（转回未决赔款准备金）占净保费的1%-5%
        os_reserve_reverseds = np.where(claim_flags == 1,
                                        net_premiums * np.random.uniform(0.01, 0.05, num_policies),
                                        0)

        # ========== 生成财务数据 ==========
        # 业务及管理费（业务及管理费）占总保费的8%-13%
        management_expenses = total_premiums * np.random.uniform(0.08, 0.13, num_policies)
        # 手续费及佣金（手续费及佣金）占总保费的12%-20%
        commission_expenses = total_premiums * np.random.uniform(0.12, 0.20, num_policies)
        # 分保费用（分保费用）占总保费的3%-5%
        reinsurance_expenses = total_premiums * np.random.uniform(0.03, 0.05, num_policies)
        # 保险业务营业税金及附加（保险业务营业税金及附加）占总保费的5%-8%
        tax_surcharges = total_premiums * np.random.uniform(0.05, 0.08, num_policies)
        # 提取未到期责任准备金（提取未到期责任准备金）占总保费的15%-25%
        ue_reserve_incurreds = total_premiums * np.random.uniform(0.15, 0.25, num_policies)
        # 转回未到期责任准备金（转回未到期责任准备金）占总保费的6%-10%
        ue_reserve_reverseds = total_premiums * np.random.uniform(0.06, 0.10, num_policies)

        # ========== 创建DataFrame整合所有数据 ==========
        data = pd.DataFrame({
            'policy_id': policy_ids,  # 保单ID
            'institution_id': institution_ids,  # 机构ID
            'region_code': [inst.split('_')[1].upper() for inst in institution_ids],  # 区域代码
            'issue_date': dates,  # 保单签发日期
            'total_premium': total_premiums,  # 总保费（原保费收入）
            'net_premium': net_premiums,  # 净保费
            'ceded_premium': ceded_premiums,  # 分出保费
            'ceded_commission': ceded_commissions,  # 摊回分保费用
            'claim_paid': claim_paids,  # 赔付支出
            'os_reserve_incurred': os_reserve_incurreds,  # 提取未决赔款准备金
            'os_reserve_reversed': os_reserve_reverseds,  # 转回未决赔款准备金
            'management_expense': management_expenses,  # 业务及管理费
            'commission_expense': commission_expenses,  # 手续费及佣金
            'reinsurance_expense': reinsurance_expenses,  # 分保费用
            'tax_surcharge': tax_surcharges,  # 保险业务营业税金及附加
            'ue_reserve_incurred': ue_reserve_incurreds,  # 提取未到期责任准备金
            'ue_reserve_reversed': ue_reserve_reverseds  # 转回未到期责任准备金
        })

        # ========== 添加时间维度列 ==========
        data['year'] = data['issue_date'].dt.year  # 年
        data['month'] = data['issue_date'].dt.month  # 月
        data['week'] = data['issue_date'].dt.isocalendar().week  # 周（ISO标准）
        data['date'] = data['issue_date'].dt.date  # 日期

        return data

    def calculate_earned_premium(self, group):
        """
        计算已赚保费

        公式：已赚保费 = 原保费收入 - 分出保费 - 提取未到期责任准备金 + 转回未到期责任准备金
        :param group: 分组数据 (DataFrame group)
        :return: 已赚保费
        """
        return (group['total_premium'].sum()
                - group['ceded_premium'].sum()
                - group['ue_reserve_incurred'].sum()
                + group['ue_reserve_reversed'].sum())

    def calculate_net_claims(self, group):
        """
        计算净赔付支出

        公式：净赔付支出 = 赔付支出 + 提取未决赔款准备金 - 转回未决赔款准备金
        :param group: 分组数据 (DataFrame group)
        :return: 净赔付支出
        """
        return (group['claim_paid'].sum()
                + group['os_reserve_incurred'].sum()
                - group['os_reserve_reversed'].sum())

    def calculate_total_expenses(self, group):
        """
        计算总费用支出

        公式：总费用支出 = 业务及管理费 + 手续费及佣金 + 分保费用 + 保险业务营业税金及附加 - 摊回分保费用
        :param group: 分组数据 (DataFrame group)
        :return: 总费用支出
        """
        return (group['management_expense'].sum()
                + group['commission_expense'].sum()
                + group['reinsurance_expense'].sum()
                + group['tax_surcharge'].sum()
                - group['ceded_commission'].sum())

    def calculate_metrics(self, group):
        """
        计算所有成本费用指标

        包括赔付率、综合费用率、综合成本率、保费费用率和手续费佣金比率
        :param group: 分组数据 (DataFrame group)
        :return: 包含所有指标的Series
        """
        # 计算基础指标
        earned_premium = self.calculate_earned_premium(group)  # 已赚保费
        net_claims = self.calculate_net_claims(group)  # 净赔付支出
        total_expenses = self.calculate_total_expenses(group)  # 总费用支出
        total_premium = group['total_premium'].sum()  # 总保费（原保费收入）

        # 安全除法函数（避免除零错误）
        safe_divide = lambda x, y: x / y * 100 if y != 0 else 0

        # 计算并返回所有指标
        return pd.Series({
            '已赚保费': earned_premium,  # 已赚保费（金额）
            '净赔付支出': net_claims,  # 净赔付支出（金额）
            '总费用支出': total_expenses,  # 总费用支出（金额）
            '赔付率(%)': safe_divide(net_claims, earned_premium),  # 赔付率
            '综合费用率(%)': safe_divide(total_expenses, earned_premium),  # 综合费用率
            '综合成本率(%)': safe_divide(net_claims + total_expenses, earned_premium),  # 综合成本率
            '保费费用率(%)': safe_divide(group['management_expense'].sum(), total_premium),  # 保费费用率
            '手续费佣金比率(%)': safe_divide(group['commission_expense'].sum(), total_premium)  # 手续费佣金比率
        })

    def apply_ad_flags(self, result_df):
        """
        应用AD标（异常检测标记）

        根据预设阈值标记异常指标
        :param result_df: 包含指标计算结果的数据框
        :return: 添加了AD标的数据框
        """
        # 遍历所有配置的指标和阈值
        for metric, threshold in self.ad_thresholds.items():
            alert_col = f'{metric}_AD'  # AD标列名（例如：赔付率(%)_AD）
            result_df[alert_col] = '正常'  # 默认标记为正常

            # 赔付率异常检测（超过阈值标记预警）
            if metric == '赔付率(%)':
                result_df.loc[result_df[metric] > threshold, alert_col] = '预警'

            # 综合成本率异常检测（超过100%意味着承保亏损）
            elif metric == '综合成本率(%)':
                result_df.loc[result_df[metric] > threshold, alert_col] = '预警'

            # 手续费佣金比率异常检测（超过阈值表示渠道成本过高）
            elif metric == '手续费佣金比率(%)':
                result_df.loc[result_df[metric] > threshold, alert_col] = '预警'

        return result_df

    def analyze_by_time_period(self, time_period='month', region=None):
        """
        按时间周期分析成本费用指标

        支持按日、周、月、年不同时间维度分析
        :param time_period: 时间周期 ('day', 'week', 'month', 'year')
        :param region: 区域代码 (None表示全部区域)
        :return: 分析结果DataFrame
        """
        # 复制数据避免修改原始数据
        df = self.data.copy()

        # 如果指定了区域，筛选该区域数据
        if region:
            df = df[df['region_code'] == region]

        # 确定分组列（区域+时间周期）
        group_cols = ['region_code', time_period]

        # 如果是最细粒度的日期分析
        if time_period == 'date':
            group_cols = ['region_code', 'date']

        # 按时间周期分组计算指标
        result = df.groupby(group_cols).apply(self.calculate_metrics).reset_index()

        # 添加中文区域名称（便于阅读）
        result['区域名称'] = result['region_code'].map(self.region_mapping)

        # 应用AD标（异常检测标记）
        result = self.apply_ad_flags(result)

        # 格式化时间周期显示
        if time_period == 'month':
            result['时间周期'] = result['month'].apply(lambda m: f"{m}月")
        elif time_period == 'week':
            result['时间周期'] = result['week'].apply(lambda w: f"第{w}周")
        elif time_period == 'year':
            result['时间周期'] = result['year'].apply(lambda y: f"{y}年")
        elif time_period == 'date':
            result['时间周期'] = result['date'].astype(str)

        # 选择并排序列（确保输出顺序一致）
        cols = ['区域名称', '时间周期', '已赚保费', '赔付率(%)', '赔付率(%)_AD',
                '综合费用率(%)', '综合成本率(%)', '综合成本率(%)_AD',
                '保费费用率(%)', '手续费佣金比率(%)', '手续费佣金比率(%)_AD']

        return result[cols].sort_values(['区域名称', '时间周期'])

    def generate_report(self, time_period='month'):
        """
        生成区域成本费用分析报告

        生成所有区域的分析报告
        :param time_period: 时间周期 ('day', 'week', 'month', 'year')
        :return: 包含所有区域分析结果的字典
        """
        report = {}
        # 遍历所有区域生成报告
        for region in ['HQ', 'EAST', 'WEST']:
            region_name = self.region_mapping[region]  # 获取区域中文名称
            report[region_name] = self.analyze_by_time_period(time_period, region)
        return report

    def detect_anomalies(self, threshold=0.8):
        """
        检测异常指标（超过阈值的指标）

        识别需要特别关注的异常指标
        :param threshold: 异常检测阈值 (0-1)，例如0.9表示90%阈值
        :return: 异常指标DataFrame
        """
        # 计算月度数据（作为异常检测的基础）
        monthly_data = self.analyze_by_time_period('month')

        anomalies = []  # 存储异常结果

        # 遍历每一行数据
        for _, row in monthly_data.iterrows():
            region = row['区域名称']  # 区域名称
            period = row['时间周期']  # 时间周期

            # 检测赔付率异常（超过阈值的90%）
            if row['赔付率(%)'] > self.ad_thresholds['赔付率(%)'] * threshold:
                anomalies.append({
                    '区域': region,
                    '时间': period,
                    '指标': '赔付率',
                    '值': row['赔付率(%)'],
                    '阈值': self.ad_thresholds['赔付率(%)'] * threshold,
                    '风险等级': '高'  # 高风险异常
                })

            # 检测综合成本率异常（超过阈值的90%）
            if row['综合成本率(%)'] > self.ad_thresholds['综合成本率(%)'] * threshold:
                anomalies.append({
                    '区域': region,
                    '时间': period,
                    '指标': '综合成本率',
                    '值': row['综合成本率(%)'],
                    '阈值': self.ad_thresholds['综合成本率(%)'] * threshold,
                    '风险等级': '高'  # 高风险异常（可能导致承保亏损）
                })

            # 检测手续费佣金比率异常（超过阈值的90%）
            if row['手续费佣金比率(%)'] > self.ad_thresholds['手续费佣金比率(%)'] * threshold:
                anomalies.append({
                    '区域': region,
                    '时间': period,
                    '指标': '手续费佣金比率',
                    '值': row['手续费佣金比率(%)'],
                    '阈值': self.ad_thresholds['手续费佣金比率(%)'] * threshold,
                    '风险等级': '中'  # 中等风险异常（渠道成本过高）
                })

        # 将异常列表转换为DataFrame
        return pd.DataFrame(anomalies)

    def plot_metrics_trend(self, df, region_name, time_period='month'):
        """
        绘制关键指标随时间变化的趋势图

        :param df: 包含指标数据的DataFrame
        :param region_name: 区域名称
        :param time_period: 时间周期 ('month', 'week'等)
        """
        # 创建模型专属目录
        model_dir = os.path.join(self.output_dir, f"{region_name}_趋势分析")
        os.makedirs(model_dir, exist_ok=True)

        plt.figure(figsize=(14, 10))

        # 1. 赔付率趋势
        plt.subplot(3, 1, 1)
        sns.lineplot(x='时间周期', y='赔付率(%)', data=df, marker='o', label='赔付率')
        plt.axhline(y=self.ad_thresholds['赔付率(%)'], color='r', linestyle='--', label='预警阈值')
        plt.title(f'{region_name}赔付率趋势 ({time_period})')
        plt.ylabel('赔付率(%)')
        plt.xticks(rotation=45)
        plt.legend()
        plt.grid(True, linestyle='--', alpha=0.7)

        # 2. 综合成本率趋势
        plt.subplot(3, 1, 2)
        sns.lineplot(x='时间周期', y='综合成本率(%)', data=df, marker='s', label='综合成本率')
        plt.axhline(y=self.ad_thresholds['综合成本率(%)'], color='r', linestyle='--', label='预警阈值')
        plt.title(f'{region_name}综合成本率趋势 ({time_period})')
        plt.ylabel('综合成本率(%)')
        plt.xticks(rotation=45)
        plt.legend()
        plt.grid(True, linestyle='--', alpha=0.7)

        # 3. 手续费佣金比率趋势
        plt.subplot(3, 1, 3)
        sns.lineplot(x='时间周期', y='手续费佣金比率(%)', data=df, marker='^', label='手续费佣金比率')
        plt.axhline(y=self.ad_thresholds['手续费佣金比率(%)'], color='r', linestyle='--', label='预警阈值')
        plt.title(f'{region_name}手续费佣金比率趋势 ({time_period})')
        plt.ylabel('手续费佣金比率(%)')
        plt.xticks(rotation=45)
        plt.legend()
        plt.grid(True, linestyle='--', alpha=0.7)

        plt.tight_layout()

        # 保存图像到模型目录
        plot_path = os.path.join(model_dir, f'{region_name}_{time_period}趋势图.png')
        plt.savefig(plot_path, dpi=300, bbox_inches='tight')
        plt.close()

        return plot_path

    def plot_region_comparison(self, report, time_period='month'):
        """
        绘制各区域关键指标对比图

        :param report: 分析报告字典
        :param time_period: 时间周期 ('month', 'week'等)
        """
        # 创建模型专属目录
        model_dir = os.path.join(self.output_dir, "区域对比分析")
        os.makedirs(model_dir, exist_ok=True)

        # 合并所有区域数据
        all_data = pd.concat(report.values(), ignore_index=True)

        # 计算各区域平均值
        region_avg = all_data.groupby('区域名称').agg({
            '赔付率(%)': 'mean',
            '综合成本率(%)': 'mean',
            '手续费佣金比率(%)': 'mean',
            '已赚保费': 'sum'
        }).reset_index()

        plt.figure(figsize=(15, 12))

        # 1. 赔付率对比
        plt.subplot(2, 2, 1)
        sns.barplot(x='区域名称', y='赔付率(%)', data=region_avg, palette='viridis')
        plt.axhline(y=self.ad_thresholds['赔付率(%)'], color='r', linestyle='--', label='预警阈值')
        plt.title('各区域赔付率对比')
        plt.ylabel('赔付率(%)')
        plt.grid(True, linestyle='--', alpha=0.7)

        # 2. 综合成本率对比
        plt.subplot(2, 2, 2)
        sns.barplot(x='区域名称', y='综合成本率(%)', data=region_avg, palette='coolwarm')
        plt.axhline(y=self.ad_thresholds['综合成本率(%)'], color='r', linestyle='--', label='预警阈值')
        plt.title('各区域综合成本率对比')
        plt.ylabel('综合成本率(%)')
        plt.grid(True, linestyle='--', alpha=0.7)

        # 3. 手续费佣金比率对比
        plt.subplot(2, 2, 3)
        sns.barplot(x='区域名称', y='手续费佣金比率(%)', data=region_avg, palette='plasma')
        plt.axhline(y=self.ad_thresholds['手续费佣金比率(%)'], color='r', linestyle='--', label='预警阈值')
        plt.title('各区域手续费佣金比率对比')
        plt.ylabel('手续费佣金比率(%)')
        plt.grid(True, linestyle='--', alpha=0.7)

        # 4. 已赚保费对比
        plt.subplot(2, 2, 4)
        sns.barplot(x='区域名称', y='已赚保费', data=region_avg, palette='magma')
        plt.title('各区域已赚保费对比')
        plt.ylabel('已赚保费')
        plt.grid(True, linestyle='--', alpha=0.7)

        plt.tight_layout()

        # 保存图像到模型目录
        plot_path = os.path.join(model_dir, f'区域对比分析_{time_period}.png')
        plt.savefig(plot_path, dpi=300, bbox_inches='tight')
        plt.close()

        return plot_path

    def plot_anomalies(self, anomalies_df):
        """
        绘制异常检测结果可视化

        :param anomalies_df: 异常检测结果DataFrame
        """
        if anomalies_df.empty:
            return None

        # 创建模型专属目录
        model_dir = os.path.join(self.output_dir, "异常检测分析")
        os.makedirs(model_dir, exist_ok=True)

        plt.figure(figsize=(14, 8))

        # 1. 异常指标分布
        plt.subplot(1, 2, 1)
        anomaly_counts = anomalies_df['指标'].value_counts()
        colors = ['#ff9999', '#66b3ff', '#99ff99']
        plt.pie(anomaly_counts, labels=anomaly_counts.index, autopct='%1.1f%%',
                colors=colors, startangle=90, shadow=True)
        plt.title('异常指标分布')

        # 2. 异常区域分布
        plt.subplot(1, 2, 2)
        region_counts = anomalies_df['区域'].value_counts()
        sns.barplot(x=region_counts.values, y=region_counts.index, palette='Set2')
        plt.title('异常区域分布')
        plt.xlabel('异常次数')

        plt.tight_layout()

        # 保存图像到模型目录
        plot_path = os.path.join(model_dir, '异常检测分析.png')
        plt.savefig(plot_path, dpi=300, bbox_inches='tight')
        plt.close()

        # 3. 高风险异常点展示
        if not anomalies_df[anomalies_df['风险等级'] == '高'].empty:
            plt.figure(figsize=(12, 6))
            high_risk = anomalies_df[anomalies_df['风险等级'] == '高']
            sns.scatterplot(x='时间', y='值', hue='指标', size='值',
                            sizes=(100, 300), data=high_risk, palette='Reds')
            plt.title('高风险异常点分布')
            plt.ylabel('指标值')
            plt.xticks(rotation=45)
            plt.grid(True, linestyle='--', alpha=0.5)

            high_risk_path = os.path.join(model_dir, '高风险异常点分布.png')
            plt.savefig(high_risk_path, dpi=300, bbox_inches='tight')
            plt.close()
        else:
            high_risk_path = None

        return plot_path, high_risk_path

    def plot_premium_distribution(self):
        """
        绘制保费分布分析图
        """
        # 创建模型专属目录
        model_dir = os.path.join(self.output_dir, "保费分布分析")
        os.makedirs(model_dir, exist_ok=True)

        plt.figure(figsize=(15, 10))

        # 1. 各区域保费分布箱线图
        plt.subplot(2, 2, 1)
        sns.boxplot(x='region_code', y='total_premium', data=self.data,
                    palette='Set3',
                    order=['HQ', 'EAST', 'WEST'])
        plt.title('各区域保费分布')
        plt.xlabel('区域')
        plt.ylabel('保费金额')
        plt.grid(True, linestyle='--', alpha=0.5)

        # 2. 保费金额分布直方图
        plt.subplot(2, 2, 2)
        sns.histplot(self.data['total_premium'], bins=30, kde=True, color='skyblue')
        plt.title('保费金额分布')
        plt.xlabel('保费金额')
        plt.ylabel('保单数量')
        plt.grid(True, linestyle='--', alpha=0.5)

        # 3. 保费随时间变化趋势
        plt.subplot(2, 1, 2)
        monthly_premium = self.data.groupby(['region_code', 'month'])['total_premium'].sum().reset_index()
        sns.lineplot(x='month', y='total_premium', hue='region_code',
                     data=monthly_premium, marker='o', palette='Dark2')
        plt.title('月度保费变化趋势')
        plt.xlabel('月份')
        plt.ylabel('总保费')
        plt.legend(title='区域')
        plt.grid(True, linestyle='--', alpha=0.5)

        plt.tight_layout()

        # 保存图像到模型目录
        plot_path = os.path.join(model_dir, '保费分布分析.png')
        plt.savefig(plot_path, dpi=300, bbox_inches='tight')
        plt.close()

        return plot_path


# 示例使用
if __name__ == "__main__":
    # 打印项目标题
    print("=" * 50)
    print("八维保险数据挖掘项目 - 财产保险成本费用分析")
    print(f"分析日期: {datetime.now().strftime('%Y-%m-%d')}")
    print("=" * 50)

    # 初始化分析器（使用默认时间范围2025年全年）
    analyzer = PropertyInsuranceAnalyzer()

    # 1. 按月分析所有区域
    print("\n>>> 月度成本费用指标分析（所有区域）:")
    monthly_report = analyzer.analyze_by_time_period('month')
    print(monthly_report.head())

    # 2. 按周分析东部区域
    print("\n>>> 东部区域周度分析:")
    east_weekly = analyzer.analyze_by_time_period('week', 'EAST')
    print(east_weekly.head())

    # 3. 检测异常指标（使用90%阈值）
    print("\n>>> 异常指标检测（阈值90%）:")
    anomalies = analyzer.detect_anomalies(threshold=0.9)
    if not anomalies.empty:
        print(anomalies)
    else:
        print("未检测到异常指标")

    # 4. 生成完整报告（按区域）
    print("\n>>> 生成区域分析报告:")
    full_report = analyzer.generate_report()

    # 5. 绘制趋势图
    print("\n>>> 生成趋势图...")
    for region, report_df in full_report.items():
        analyzer.plot_metrics_trend(report_df, region, 'month')
        print(f"  {region}趋势图已生成")

    # 6. 绘制区域对比图
    print("\n>>> 生成区域对比图...")
    analyzer.plot_region_comparison(full_report)
    print("  区域对比图已生成")

    # 7. 绘制异常检测图
    print("\n>>> 生成异常检测图...")
    if not anomalies.empty:
        analyzer.plot_anomalies(anomalies)
        print("  异常检测图已生成")

    # 8. 绘制保费分布图
    print("\n>>> 生成保费分布图...")
    analyzer.plot_premium_distribution()
    print("  保费分布图已生成")

    # 9. 保存结果到Excel
    output_file = os.path.join(analyzer.output_dir, f"财产保险成本费用分析_{datetime.now().strftime('%Y%m%d')}.xlsx")
    with pd.ExcelWriter(output_file) as writer:
        monthly_report.to_excel(writer, sheet_name='月度分析', index=False)
        east_weekly.to_excel(writer, sheet_name='东部周分析', index=False)
        if not anomalies.empty:
            anomalies.to_excel(writer, sheet_name='异常指标', index=False)

    print(f"\n分析完成! 结果已保存至目录: {analyzer.output_dir}")
    print(f"Excel报告路径: {output_file}")